home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / web / spiderweb / fixes-to-be-applied / dnn.web < prev    next >
Text File  |  1993-04-04  |  3KB  |  125 lines

  1. %<$DNN GRAMMAR Condenser - Ver DN-1A(2) - [PQN-OTFA]$>
  2. % Copyright 1989--1990 by David Ness
  3. % Not to be sold, but may be used freely for any purpose or for any purposes of
  4. % Norman Ramsey
  5.  
  6. \let\RA\rightarrow
  7.  
  8. \def\vert{{\tt\char'174}}
  9. \def\pb{$\.|\ldots\.|$} % C brackets (|...|)
  10.  
  11. \def\title{DNN GRAMMAR Condenser}
  12.  
  13. \def\topofcontents{\null\vfill
  14.   \titlefalse % include headline on the contents page
  15.   \def\rheader{\hfil}
  16.   \centerline{\titlefont The {\ttitlefont DNN GRAMMAR} Condenser}
  17.   \vfill}
  18.  
  19.  
  20. \def\syntax##1{\leavevmode\hbox{$\langle\hbox{\sl ##1\/}\rangle$}}
  21. \def\produces{\leavevmode\hbox{${}::={}$}}
  22. \def\opt##1{$[$##1$]$}
  23.  
  24. #*=The {\tt SPIDER} grammar condenser.
  25. #*Introduction.
  26. This is an \.{AWK} program designed to read a description of a grammar and to
  27. produce calls on |squash| instead of |reduce| where it can.
  28.  
  29. This might not look very important, but the grammar of {\tt C} is such that
  30. MicroSoft C 5.1 can't handle the \.{WEB} for \.{WEAVE} because the |translate|
  31. function turns out to be too large. By good luck, the condensation done here
  32. manages to (just) avoid that!
  33.  
  34. The philosophy here is very simple. We are only `interested' in lines
  35. which begin with |app1| or |reduce|. When they begin with |app1(pp+n...| we
  36. table |n| in the array |data| and don't generate anything. When they begin
  37. with |reduce| we check
  38. and see if the |reduce| is consistent with the |app1|s. If so then we just
  39. generate one |squash| for the whole mess.
  40.  
  41. In all other cases (an inconsistent |reduce| or neither an |app1| or
  42. |reduce|) we generate all of the lines (if there were any) that got swallowed
  43. into the |data| array.
  44.  
  45. #d banner = "DNN GRAMMAR.WEB Condenser -> OUT.TMP Ver DN-1A(2)"
  46. #u#1
  47. BEGIN {
  48. #<Say Hello#>
  49. #<Set initial values#>
  50. }
  51. #@
  52. #<Define Functions#>
  53. #<Pattern-action statements#>
  54. #@
  55. END {
  56. #<Do final things#>
  57. }
  58.  
  59.  
  60. # #<Set init...#>=
  61. out = "out.tmp"
  62. Base = 0
  63.  
  64. # |dumparray()| dumps any |app1(pp+...)|'s that have been accumulated so far.
  65. It is called when we get anything other than a |reduce| or |app1|, or if we
  66. get a |reduce| but it isn't {\it the right stuff!}
  67. #<Define Functions#>=
  68. function dumparray()
  69. {
  70.     if (Base != 0)
  71.     {
  72.     for (i = 0; i < Base; ++i) print "\tapp1(pp+" data[i] ");" >out
  73.     delete data
  74.     Base = 0
  75.     }
  76.     print $0 >out
  77.     return
  78. }
  79.  
  80. # If we have an |app1(pp+n)| enter |n| into the table and keep going
  81. #<Pattern-action statements#>=
  82. #=/app1\(pp\+/#> {
  83. match($0,"app1\\(pp\\+.*\\)")
  84. val = substr($0,RSTART+8,RLENGTH-9)
  85. data[Base++] = val
  86. }
  87.  
  88. # If we hit a |reduce(...)|, see if we should process it.
  89. #<Pattern-action statements#>=
  90. #=/reduce/#> {
  91.     match($0,"reduce\\(pp\\+[0-9]*\\,")
  92.     val = substr($0,RSTART+10,RLENGTH-11)
  93.     if (data[0] == val)
  94.            #<|reduce| starts where first |app1| started#>#;
  95.     else {dumparray()}
  96. }
  97.  
  98. # #<|reduce| starts where first |app1| started#>=
  99. {
  100.     match($0,",[0-9]+,")
  101.     val = substr($0,RSTART+1,RLENGTH-2)
  102.     if (val == (1+data[Base-1]-data[0]))
  103.         #<|reduce| condenses right number of elements#>#;
  104.     else {dumparray()}
  105. }
  106.  
  107. # #<|reduce| condenses right number of elements#>=
  108. {
  109.     match($0,"\\(.*\\);")
  110.     print "\tsquash" substr($0,RSTART,RLENGTH) >out
  111.     delete data
  112.     Base = 0
  113. }
  114.  
  115. # When we encounter an `uninteresting' statement, dump anything that we might
  116. have accumulated.
  117. #<Pattern-action statements#>=
  118. #=$0 !~ /app1|reduce/#> {dumparray()}
  119.  
  120. # #<Say Hello#>=print banner
  121.  
  122. # #<Do final...#>=
  123.  
  124. #*=Index.
  125.